Fondamenti di Informatica II -- A.A. 2005/2006
Corso di
Studio: Ingegneria
Informatica-Automatica
(Anno di corso: I --
CFU:
6)
Il Corso fornisce un'ampia
rassegna critica di strutture dati e algoritmi fondamentali nella
soluzione automatica di problemi, unitamente ai metodi di analisi delle prestazioni dei programmi e loro sviluppo e messa a punto. Tutte le soluzioni
presentate in classe sono state realizzate al calcolatore utilizzando il
linguaggio di programmazione C++ introdotto a Fondamenti d’Informatica
I.
Saper
fare
Progettazione, sviluppo e
messa a punto di programmi efficienti riguardanti un’ampia categoria di
problemi fondamentali utilizzando il linguaggio C++.
Contenuti
Obiettivo: discutere i principali
requisiti che ogni buon programma deve possedere, quindi soffermarsi su uno di
essi: l'efficienza spazio-temporale, fornendo metodi generali per la sua
valutazione.
Il metodo dei dati di prova,
i livelli di correttezza. Analisi dei programmi: efficienza spaziale e temporale
dei programmi. L'efficienza
temporale: il modello dei costi per i costrutti presenti nei linguaggi ad
alto livello (il caso del C++), la funzione costo temporale (t(n)), la
dimensione dell'input (n), la configurazione dell'input (caso peggiore, medio e
migliore). La complessità computazionale dei programmi: la notazione O(g(n)). Un
metodo per la determinazione della t(n): il conteggio delle frequenze. Il
passaggio dalla t(n) alla O(g(n)). Un teorema che governa tale passaggio nel
caso di funzioni costo di tipo polinomiale. Il metodo per la determinazione
diretta della O(g(n)) basato sulla regola
della somma e del prodotto. Determinazione della t(n) nel caso di codici
ricorsivi. L'efficienza spaziale: la
funzione costo spaziale (s(n)) e la notazione O(g(n)). Studio di casi.
Obiettivo: a) introdurre le
tecniche di rappresentazione, nella memoria centrale del calcolatore, delle
principali strutture discrete che intervengono nella modellazione dei dati
coinvolti nella soluzione automatica di problemi rilevanti; b) nel mostrarne la
realizzazione (le strutture dati -- SD) in C++; c) analisi critica
dell’occupazione di memoria causata dalle diverse soluzioni
proposte.
Liste: rappresentazione tramite
array (r. sequenziale), r. tramite puntatore in avanti (r. collegata), r.
tramite puntatore in avanti e indietro (r.
collegata simmetrica).
Pile: rappresentazione tramite
array (r. sequenziale), r. tramite puntatori (r.
collegata).
Code: rappresentazione tramite
array (r. sequenziale), r. tramite puntatori (r.
collegata).
Matrici sparse:
rappresentazione compatta a 3 informazioni (r.1) e r. tramite vettore di accesso
(r.2) (r. sequenziali), r. compatta a 3 informazioni (r.3) e r. tramite vettore
di accesso mediante l’uso di puntatori (r.4) (r. collegate), r. compatta tramite
doppio vettore di accesso mediante l’uso di puntatori (r.5).
Insiemi: rappresentazione tramite
array (r. sequenziale), r. tramite puntatori (r. collegata).
Grafi: rappresentazione tramite
matrice delle adiacenze, r. compatta tramite vettore di accesso dinamico della
matrice delle adiacenze (alias, liste dei successori).
Alberi: rappresentazione tramite
puntatori (r. collegata) di alberi binari e alberi ennari.
PARTE III – Algoritmi
fondamentali e loro codifica
Obiettivo:
a)
passare in rassegna i principali algoritmi noti per la soluzione di problemi
classici dell'informatica quali: la visita di grafi ed alberi, l'ordinamento
di un insieme di valori, la ricerca
di un elemento in un insieme di valori e/o in un albero binario di ricerca, la
fusione di sequenze ordinate, l’unione di insiemi, ecc; b) discuterne la
soluzione C++ ed i relativi costi computazionali.
Operazioni sulle
liste (creazione, aggiunta di un atomo, estrazione del primo atomo, test
di appartenenza di un atomo ad una lista, stampa atomi, stampa bidirezionale
atomi, concatenazione di due liste, fusione di due liste, conteggio atomi con
medesimo valore su due liste distinte, inversione atomi
lista).
Operazioni sulle pile
(creazione, stampa atomi, conta atomi, aggiunta/eliminazione
atomo).
Operazioni sulle code (creazione, stampa atomi, conta atomi, aggiunta/eliminazione atomo, concatenazione di due code).
Operazioni sulle matrici
sparse (leggi/stampa matrice, cerca massimo/minimo valore, aggiorna valore,
permuta righe, somma).
Operazioni sugli
insiemi (creazione, stampa elementi, unione/differenza/intersezione di
due insiemi, ricerca esaustiva di un valore, ricerca binaria iterativa/ricorsiva
di un valore, ordinamento dei valori di un insieme: algoritmo a bolle, per
selezione e merge-sort).
Operazioni sui grafi
(creazione e stampa di un grafo, aggiunta di un ramo/nodo, eliminazione di un ramo/nodo,
visita in profondità di un grafo, grado di
ingresso/uscita di un nodo).
Operazioni sugli alberi
binari e alberi binari di ricerca (visita in preordine, postordine e
simmetrica, ricerca di un elemento, stampa in notazione parentetica dei nodi,
cancella albero). Operazioni sugli alberi
ennari (visita in preordine e in postordine).
P. Di Felice,
Lezioni di Fondamenti di informatica, II,
Libreria Universitaria Benedetti
Editrice, 2006.
MODALITA' D’ESAME:
L’esame
verte in una prova scritta ed in una prova orale.
Prerequisiti per
l’ammissione all’esame: Aver superato Fondamenti di
Informatica I.